/* CommLineArgs.cc -- Classe para passar as variáveis da linha de
 * comando.
 *
 * Copyright (C) 2008, Diogo F. S. Ramos <diogo.ramos@usp.br>
 * GEAR - Grupo de Estudos Avançados em Robótica
 * <http://www.sel.eesc.usp.br/gear>
 *
 * This file is part of GEARMedula.
 * 
 * GEARMedula is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, version 3 of the
 * License.
 * 
 * GEARMedula is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see
 * <http://www.gnu.org/licenses/>.
 */

#include <iostream>
#include <sstream>

#include "CommLineArgs.hh"
#include "config.h"

using namespace std;

/** Construtor.
 */
CommLineArgs::CommLineArgs(void)
{
    /* Setando a estrutura args com estados padrões. */
    server_port_ = 12345;
    server_real_ = 0;
    f_server_display_ = 0;
    serial_path_ = "/dev/ttyS0";
}

/** Passa a linha de comando.
    
    Os resultados do processamento da linha de comando são guardados
    dentro de variáveis privada.

    Parâmetros procurados:

    \li \c -h Help.
    \li \c -p Porta que o servidor ficará escutando.
    \li \c -s Caminho para a serial
    \li \c -R Servidor Real ou Simulado
    \li \c -v Versão
    \li \c -d Utiliza o display

    @param argc Quantidade de argumentos.

    @param *argv[] Vetor com os parâmetros.

    @return 0 em caso de sucesso, 1 em caso de erro ou necessário a
    saída do programa.
 */
int
CommLineArgs::ParseArgs( int argc, char *argv[] )
{
    int c;

    printf("GEAR - Grupo de Estudos Avançados em Robótica\n"
	   "           GEARMedula - Servidor\n\n");
    while ((c = getopt (argc, argv, "p:s:hRdv")) != -1)
    {
	switch (c)
	{
	case 'v':
	{
	    printf("Versão %s.\n", PACKAGE_VERSION);
	    return 1;
	    break;
	}
	case 's':
	{
	    serial_path_ = optarg;
	    break;
	}
	case 'd':
	{
	    f_server_display_ = 1;
	    break;
	}
	case 'h':
	{
	    cout << "Utilize as seguintes opções:" << endl << endl
		 << "-p Porta em que o sevidor ficará escutando (Padrão em " << getServerPort() << ")" << endl
		 << "-R Servidor em modo Mundo Real. (Simulação é o modo padrão)" << endl
		 << "-s Caminho para a serial. (Padrão em " << getSerialPath() << ")" << endl
		 << "-d Ativa o display do servidor" << endl
		 << "-v Retorna a versão do GEARMedula" << endl
		 << "-h Esta ajuda." << endl;
	    return 1;
	    break;
	}
	case 'R':
	{
	    server_real_ = 1;
	    break;
	}
	case 'p':
	{
	    server_port_ = strtol( optarg, NULL, 10 );
	    break;
	}
	case '?':
	{
	    if (optopt == 'c')
		fprintf (stderr, "Option -%c requires an argument.\n", optopt);
	    else if (isprint (optopt))
		fprintf (stderr, "Unknown option `-%c'.\n", optopt);
	    else
		fprintf (stderr,
			 "Unknown option character `\\x%x'.\n",
			 optopt);
	}
	default:
	{
	    abort ();
	}
	}
    }
    return 0;   
}

/** Retorna a porta do servidor.

    @return porta do servidor.
*/
int
CommLineArgs::getServerPort( void )
{
    return server_port_;
}

/** Retorna se o Servidor é real ou simulado.

    @return 1 para servidor real, 0 para simulado.
*/
int
CommLineArgs::getServerReal()
{
    return server_real_;
}

/** Retorna se o servidor usará ou não a componente Display.

    @return 1 para sim, 0 para não.
*/
int
CommLineArgs::getServerDisplay( void )
{
    return f_server_display_;
}

/** Retorna o caminho para a serial.

    @return Caminho para a serial.
*/
string
CommLineArgs::getSerialPath( void )
{
    return serial_path_;
}

/** Imprime todos os argumentos registrados.
 */
void
CommLineArgs::printAllOptions()
{
    cout << "Server Port= " << getServerPort() << endl
	 << "Server Real= " << getServerReal() << endl
	 << "Server Display= " << getServerDisplay() << endl
	 << "Serial Path= " << getSerialPath() << endl;
}
